iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
自我挑戰組

PHP框架-Laravel自學挑戰系列 第 5

DAY5-練習撰寫Laravel框架中的Routes和Controllers

  • 分享至 

  • xImage
  •  

哈囉大家好~
今天算是要正式開始寫程式碼的起點!那就先從昨天玩的routes和blade template開始吧~

昨天自己試著寫了非常陽春的語錄網頁,利用定義相對的路徑以及blade模版(程式碼如下)
前端畫面顯示:

<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <h1>Hello World! My first Laravel Project!</h1>
    </body>
</html>

對應畫面的路徑定義:

<?php

use Illuminate\Support\Facades\Route;

Route::get('/hello', function() {
    return view('hello');
});

但其實除了上面的定義路徑方法之外,也可以把切換路徑的邏輯寫在controller裡面,如下所示~
首先在app/Http/Controllers這個目錄夾中創建HomeController.php並撰寫controller控制器

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HomeController extends Controller 
{
    public function index()
    {
        return view('home');
    }
}
?>

這裡用到了物件導向的概念,當呼叫這個類的function時,就會顯示裡面定義的這個"home"的模板畫面。
接下來我們要定義這個畫面的路徑,要回到定義路徑的routes/web.php

use Illuminate\Support\Facades\Route; 
use App\Http\Controllers\HomeController;#這裡不要忘記引進剛剛寫的Controller喔

Route::get('/home', [HomeController::class, 'index']);

第一個參數'/home'是對應介面顯示的路徑,第二個原本放function的參數,改成放我們定義的HomeController還有返回home畫面的function-index。

最後再建立一個home.blade.php在views目錄中(這裡就不貼上陽春程式碼了XD)
在瀏覽器打開localhost:8000/home就可以看到在home.blade.php撰寫的介面了~

問題很多的我這時候就覺得奇怪,明明第一種方法比較簡單且直觀(還可以少寫一個檔案XD)
為什麼會需要用到Controller呢?俗話說的好,「天生我材必有用!」Controller一定有它存在的意義~
下面就來簡單說明controller和一般routing的差異:

Controller將應用程式的邏輯封裝起來,把邏輯的部份和routing分開。Controller用來將類似的邏輯集合起來,讓程式碼寫起來更有組織架構性,管理起來也較方便。例如:透過model和資料庫互動,回應請求⋯⋯等。將邏輯的部份在controller好,在web.php就可以單純處理回傳畫面的任務。

誒⋯⋯那我怎麼知道什麼時候要用哪一種方式呢?
當然也可以在controller裡面撰寫純回傳路徑對應畫面的程式碼,只不過難免有「殺雞焉用牛刀」的感覺XD

通常如果只是要回傳簡單的文字或畫面,就不寫controller,直接在web.php檔中撰寫function回傳該路徑的blade模版。或是那個畫面只有包含一點點的邏輯,例如靜態網頁。
雖然這個寫法比較簡單直觀,但如果應用程式越長越大,這樣的撰寫方式很容易導致專案程式碼的混亂以及架構參差不齊,沒有模組化的情況下也會導致日後測試的困難。

於是Controller就來幫忙處理複雜的任務啦~
創建controller後,我們就可以重複使用裡面定義的function來幫我們處理重複性的任務,或是幫忙處理對資料庫的增刪修改,也可以處理帶有query的請求。
Controller可以讓測試變得更容易(模組化),在程式碼的維護上也輕鬆許多(例如某個function有bug,只要修改那個function就好,其他function因為保持獨立不受影響)

總而言之,controller將邏輯和routing分開,routes會幫忙把路徑和對應的controller action配對,然後被配對到的controller就會自動處理該任務的邏輯。
除此之外,controller也允許middleware和dependency的注入,讓開發者更容易處理認證和驗證!

為了體驗Controller的強大,決定自己試著在Controller中處理邏輯的部份!
假設我今天想要在路徑後面添加query string "sayMyName",我可以在controller裡面做修改:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HomeController extends Controller 
{
    public function index(Request $request) #Request Object
    {
        $name = $request->query('sayMyName', 'Heisenberg'); //第二個參數為預設字串
        
        return "Hello, $name~~";
    }
}
?>

web.php中定義的路徑:

use Illuminate\Support\Facades\Route; 
use App\Http\Controllers\HomeController;#這裡不要忘記引進剛剛寫的Controller喔

Route::get('/home', [HomeController::class, 'index']);

接下來在瀏覽器打開localhost:8000/home?sayMyName=Mary就可以看到Hello, Mary~~
註:如果沒有query string,就會出現預設的第二個參數,也就會看到Hello, Heisenberg~~/images/emoticon/emoticon04.gif


那麼今天對於routes和Controller就簡單介紹到這邊啦~
明天要來研究一下blade模版的語法!(想要寫出更漂亮的畫面XD)
希望可以越來越熟悉Laravel的語法~


上一篇
DAY4-初次啟動Laravel專案!Laravel程式碼架構大揭秘(下)
下一篇
DAY6-練習撰寫Laravel框架中的blade模版-(1)
系列文
PHP框架-Laravel自學挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言